iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0

ESP32-CAM 簡介

目錄

本次使用的是 ESP32-CAM 設備,它是安信可科技發佈小尺寸的攝像頭模組。該模塊可以作為最小系統獨立工作,尺寸僅為 27x40.5x4.5 mm,可廣泛應用於各種物聯網場合,適用於家庭智能設備、工業無線控制、無線監控、QR無線識別,無線定位系統信號以及其它物聯網應用,是物聯網應用的理想解決方案。

ESP32-CAM特性

  • 基於 ESP32-S 系列,處理器是 ESP32-D0WD
  • 採用低功耗雙核 32 位 CPU,可作應用處理器
  • 體積超小的 802.11b/g/n Wi-Fi + BT/BLE SoC模塊
  • 主頻高達 240MHz,運算能力高達 600 DMIPS
  • 內置 520 KB SRAM,外置 8MB PSRAM
  • 支持 UART/SPI/I2C/PWM/ADC/DAC 等接口
  • 支持 OV2640 和 OV7670 攝像頭,內置閃光燈
  • 支持圖片 WiFI 上傳
  • 支持 TF 卡
  • 支持多種休眠模式。
  • 內嵌 Lwip 和 FreeRTOS
  • 支持 STA/AP/STA+AP 工作模式
  • 支持 Smart Config/AirKiss 一鍵配網
  • 支持串口本地升級和遠程固件升級(FOTA)

https://ithelp.ithome.com.tw/upload/images/20240814/20129510wooWztDywL.png
圖 1. ESP32-CAM 管腳定義

順道提一下 ESP32-CAM 所使用的單晶片是來自於 ESP32 這一系列的低成本,低功耗的單晶片微控制器,整合了 Wi-Fi 和雙模藍牙。 ESP32 系列採用 Tensilica Xtensa LX 6微處理器,包括雙核心和單核變體,內建天線開關,RF變換器,功率放大器,低雜訊接收放大器,濾波器和電源管理模組。

ESP32 由總部位於上海的中國公司樂鑫信息科技創建和開發,由台積電採用40奈米技術製造。它是 ESP8266 微控制器的後繼產品。而以 ESP32 晶片有製作出多個系列的模塊,分別是 ESP32-S 系列、ESP32-C 系列與ESP32 系列。

而 ESP32 模組還可以細分成以下幾個子系列:

  • ESP32-WROOM 系列模組基於 ESP32-D0WD 雙核晶片設計,適用於基於 Wi-Fi 和藍牙連接的應用場景,具備強大的雙核性能。
  • ESP32-WROVER 系列模組基於 ESP32-D0WD 雙核晶片設計,其強大的雙核性能適用於對記憶體需求大的應用場景,例如多樣的 AIoT 應用和網關應用。
  • ESP32-MINI 系列模組基於 ESP32-U4WDH 單核晶片設計, 為基於 Wi-Fi 和藍牙連接的應用提供了高性價比的解決方案。

上面所提到的 ESP32-D0WD 晶片的描述是:

代號 意義 說明
D 內核 D=雙核、S=單核
0 嵌入式 Flash 0=無、2=16Mbit
WD 通信模式 WD=Wi-Fi b/g/n + BT/BLE 雙頻AD=Wi-Fi a/b/g/n + BT/BLE 雙頻CD=Wi-Fi ac/c/b/g/n + BT/BLE 雙頻

ESP32-CAM系統架構

因為 ESP32-CAM 內核是 ESP32-S,以下所有的說明來自 ESP32 技術參考手冊。 ESP32 是一個雙核系統,具有兩個哈佛架構(Harvard Architecture) Xtensa LX6 CPU。所有嵌入式記憶體(embedded memory),外部記憶體(external memory)和外圍設備(peripherals)位於這些 CPU 的資料總線和/或指令總線上。

兩個 CPU 的地址映射是對稱的,這意味著它們使用相同的地址訪問相同的記憶體。系統中的多個外設可以通過 DMA (Direct Memory Access 直接記憶體存取,以下簡稱 DMA) 訪問嵌入式記憶體。

這兩個 CPU 被命名為 「PRO_CPU」 和 「APP_CPU」(分別代表「協議(Protocol)」和「應用程序(Application)」),但是,對於大多數用途而言,這兩個 CPU 是可以互換的。

地址空間

  • 對稱地址映射
  • 4 GB(32 位)地址空間用於資料總線和指令總線
  • 1296 KB 嵌入式記憶體地址空間
  • 19704 KB 外部記憶體地址空間
  • 512 KB 外設地址空間
  • 一些嵌入式和外部記憶體區域可以通過資料總線或指令總線訪問
  • 328 KB DMA 地址空間

嵌入式記憶體

  • 448 KB 內部 ROM
  • 520 KB 內部 SRAM
  • 8 KB RTC (Real-Time Clock 實時時鐘, 以下簡稱 RTC) 快速記憶體
  • 8 KB RTC 慢記憶體

外部記憶體
片外(off-Chip) SPI (Serial Peripheral Interface串行外設接口, 以下簡稱 SPI)存儲器可以映射到可用地址空間作為外部記憶體。部分的嵌入式記憶體可用作該外部記憶體的透明緩存。

  • 支持高達 16 MB 的 off-Chip SPI 閃存 (Flash)。
  • 支持高達 8 MB 的 off-Chip SPI SRAM (PSRAM)。

外圍設備

  • 41 個外設 (Peripherals)

直接存取

  • 13 個模塊能夠進行 DMA 操作

常用存儲器的介紹:

  • 資料易失性的存儲器:這類存儲器讀寫速度較快,但是掉電後資料會丟失,在 SoC 設計中通常被用作資料緩存、程序緩存。常見的是隨機存取存儲器 (Random Access Memory, 以下簡稱 RAM) ,常見的種類有 DRAM (Dynamic RAM,動態 RAM)-需要實時刷新來保持資料,價格便宜,一般用於大容量產品;SRAM (Static RAM,靜態RAM) -不需要刷新。速度快,面積大。;
  • 資料非易失性存儲器 (Non-Volatile Memory):這類存儲器讀寫速度比較慢,但是在掉電後資料不會丟失。因此,在 SoC 設計中可用作大資料的存儲或者固件程序的存儲。如 NAND/NOR flash,NOR flash 屬於是可以隨機訪問的,是屬於非易失性隨機訪問存儲器 (Non-Volatile Random Access Memory, 以下簡稱 NVRAM);NAND flash 屬於順序訪問 (sequential access)。
  • 新出現的存儲器 PSRAM(pseudo SRAM),稱之為偽靜態隨機存取器。它具有 SRAM 的接口協議,但是它的內核架構卻是 DRAM 架構;相較於傳統的 SRAM , PSRAM 可以實現較大的存儲容量;

下圖是 ESP32 系統架構圖,PRO_CPU 和 APP_CPU 面對的是相同的地址空間,可以直接讀取嵌入式記憶體與外圍設備地址,而對於外部記憶體空間,需要透過快取 (Cache) 與記憶體管理單元 (Memory Management Unit, 以下簡稱 MMU) 才能進行存取。

https://ithelp.ithome.com.tw/upload/images/20240814/20129510k7r2oOVPQ9.png
圖 2. ESP32 系統架構

https://ithelp.ithome.com.tw/upload/images/20240814/20129510jxtSAd9yvS.png
圖 3. ESP32 系統地址對應圖

https://ithelp.ithome.com.tw/upload/images/20240814/20129510CFx4dUt5Hi.png

圖 4. ESP32 系統地址對應表格

ESP32 啓動流程

ESP32 從上電到執行 Micropython 中間所經歷的啓動流程步驟。

宏觀上,啓動流程可以分為如下 3 個步驟:

  1. 一級引導程序被寫死在了 ESP32 內部的 ROM 中,它會從 flash 的 0x1000 地址處加載二級引導程序至 RAM (IRAM & DRAM) 中。
  2. 二級引導程序從 flash 中加載分區表和主程序鏡像至記憶體中,主程序中包含了 RAM 段和通過 flash 高速緩存映射的只讀段。
  3. 應用程序 啓動階段執行,這時第二個 CPU (APP_CPU) 和 RTOS (PRO_CPU) 的調度器啓動。

一級引導程序
ESP32 SoC (System on a Chip, 簡稱SoC)復位(reset)後,PRO_CPU 會立即開始執行,執行復位向量代碼,而 APP_CPU 仍然保持復位狀態。在啓動過程中,PRO_CPU 會執行所有的初始化操作。APP_CPU 的復位狀態會在應用程序啓動代碼的 call_start_cpu0 函數中失效。復位向量代碼位於 ESP32 的 ROM 裡,所以不能被修改。二級引導程序二進制鏡像會從 flash 的 0x1000 地址處加載。

二級引導程序
ESP-IDF (Espressif IoT Development Framework, 以下簡稱 ESP-IDF) 是樂鑫官方推出的物聯網開發框架,支持 Windows、Linux 和 macOS 作業系統。
下表總結了樂鑫晶片在 ESP-IDF 各版本中的支持狀態,其中 supported 代表已支持,preview 代表目前處於預覽支持狀態。預覽支持狀態通常有時間限制,而且僅適用於測試版晶片。請確保使用與晶片相匹配的 ESP-IDF 版本。

表 1. ESP-IDF 各版本中的支持狀態

晶片 v4.1 v4.2 v4.3 v4.4 v5.0 v5.1
ESP32 supported supported supported supported supported supported
ESP32-S2   supported supported supported supported supported
ESP32-C3     supported supported supported supported
ESP32-S3       supported supported supported
ESP32-C2         supported supported
ESP32-C6           supported
ESP32-H2 beta1/2       preview preview preview

使用 ESP-IDF 針對 ESP32 晶片所編譯出來的二進制鏡像,透過燒錄軟體(esptool.py)燒錄到 flash 的 0x1000 偏移地址處,那個二進制鏡像就是二級引導程序。二級引導程序的源碼可以在 ESP-IDF 的 components/bootloader 目錄下找到。ESP-IDF 使用二級引導程序可以增加 flash 分區的靈活性(使用分區表),並且方便實現 flash 加密,安全引導和空中升級(Over The Air, OTA)等功能。

https://ithelp.ithome.com.tw/upload/images/20240814/20129510Kwg7ds6GeN.png

圖 5. ESP-IDF 的二級引導程序源碼所在

當一級引導程序校驗並加載完二級引導程序後,它會從二進制鏡像的頭部找到二級引導程序的入口點,並跳轉過去執行。二級引導程序默認從 flash 的 0x8000 偏移地址處(可配置的值)讀取分區表。引導程序會尋找工廠分區和 OTA 應用程序分區。如果在分區表中找到了 OTA 應用程序分區,引導程序將查詢 otadata 分區以確定應引導哪個分區。

應用程序
應用程序啓動包含了從應用程序開始執行到 app_main 函數在主任務內部執行前的所有過程。可分為三個階段:

  1. 端口初始化:端口層的初始化功能會初始化基本的 C 執行環境,並對 SoC 的內部硬件進行了初始配置。

    • 為應用程序重新配置 CPU 異常。
    • 初始化內部存儲器。
    • 完成 MMU 高速緩存配置。
    • 如果配置了 PSRAM,則使能 PSRAM。
    • 將 CPU 時鐘設置為項目配置的頻率。
    • 根據應用程序頭部設置重新配置主 SPI flash,這是為了與 ESP-IDF V4.0 之前的引導程序版本兼容。
    • 如果應用程序被配置為在多個內核上執行,則啓動另一個內核 (APP_CPU) 並等待其初始化
  2. 系統初始化:主要的系統初始化任務包括以下

    • 如果默認的日誌級別允許,則記錄該應用程序的相關信息。
    • 初始化堆分配器。
    • 初始化 newlib 組件的系統調用和時間函數。
    • 配置斷電檢測器。
    • 根據 串行控制台配置 設置 libc stdin、stdout、和 stderr。
    • 執行與安全有關的檢查。
    • 初始化 SPI flash API 支持。
    • 調用全局 C++ 構造函數和任何標有 __attribute__((constructor)) 的 C 函數。
  3. 執行主任務:在所有其他組件都初始化後,主任務會被創建,FreeRTOS 調度器開始執行。做完一些初始化任務後,主任務在固件中執行應用程序提供的函數 app_main。

APP CPU 的內核啓動流程
當執行系統初始化時,PRO_CPU 上的代碼會給 APP_CPU 設置好入口地址,解除其復位狀態,然後等待 APP_CPU 上執行的代碼設置一個全局標誌,以表明 APP_CPU 已經正常啓動。

參考資料


上一篇
D06-Python 函數與模組
下一篇
D08-使用 MicroPython 開發 ESP32-CAM - 使用圖形化工具 Thonny (Windows)
系列文
在AWS上進行物聯網與人工智慧實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言